<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // async function fn() {
    //   console.log('fn()')
    //   // return 3
    //   // throw 4
    //   // return Promise.reject(5)
    //   // return Promise.resolve(6)
    // }

    /* ---------------------------------- */

    /* 
    async函数执行的结果为promise对象
    promise对象的结果状态由async函数体执行的结果决定  
      ==> 与then返回的promise的状态判断方式一致
    */
    // const p = fn()
    // p.then(
    //   value => {
    //     console.log('onResolved', value)
    //   },
    //   reason => {
    //     console.log('onRejected', reason)
    //   }
    // )


    // async function fn2() {
    //   const value = await {m: 1}   // 如果await的不是promise直接返回它
    //   console.log(value)
    // }
    // fn2()


    /* ---------------------------------------- */

    // function fn() {
    //   return new Promise((resolve, reject) => {
    //     setTimeout(() => {
    //       reject(new Error('难受'))
    //       // resolve('开心')
    //     }, 1000)
    //   })
    // }

    // async function test() {
    //   // 如果await的promise失败, 需要使用try...catch处理
    //   try {
    //     const value = await fn()   // await只能得到成功promise的异步value
    //     console.log(value)
    //   } catch(error) {
    //     console.log('捕获到错误', error.message)
    //   }
    // }
    // test()

    /* 
    练习：请求a数据，请求成功再请求b数据
    */
    /* new Promise((resolve, reject) => {
      console.log('发异步请求1获取数据')
      setTimeout(() => {
        resolve({message: '请求1的成功数据'})
      }, 1000)
    }).then(value => { // 得到前面promise的成功的value数据
      console.log('得到请求1成功的数据', value)
      // 可以去执行新的异步任务 
      return new Promise((resolve, reject) => {  // 3
        console.log('发异步请求2获取数据')
        setTimeout(() => {
          resolve({message: '请求2的成功数据'})
        }, 1000)
      })
    }).then(value => {
      console.log('得到请求2成功的数据', value)
      // 可以去执行新的异步任务 
      return new Promise((resolve, reject) => {  // 3
        console.log('发异步请求3获取数据')
        setTimeout(() => {
          resolve({message: '请求3的成功数据'})
        }, 2000)
      })
    }).then(value => {
      console.log('得到请求3成功的数据', value)
    }) */

    async function request3() {
      console.log('------')
      const result1 = await new Promise((resolve, reject) => {
        console.log('发异步请求1获取数据')
        setTimeout(() => {
          resolve({message: '请求1的成功数据'})
        }, 1000)
      })
      console.log(result1)
      
      const result2 = await new Promise((resolve, reject) => {  // 3
        console.log('发异步请求2获取数据')
        setTimeout(() => {
          resolve({message: '请求2的成功数据'})
        }, 1000)
      })
      console.log(result2)
      
      const result3 = await new Promise((resolve, reject) => {  // 3
        console.log('发异步请求3获取数据')
        setTimeout(() => {
          resolve({message: '请求3的成功数据'})
        }, 2000)
      })
      console.log(result3)
    }

    request3()

  </script>
</body>
</html>